package com.company.gas.config;


import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author: Li Guangdi
 *
 */
@Configuration
public class ShiroConfig {
    //ShiroFilterFactoryBean
    @Bean(name = "bean")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager);//设置安全管理器
        //设置自定义filter---
        //这里很重要：在springboot中 如何使用自定义的拦截器
        RoleOrFilter roleOrFilter = new RoleOrFilter(); //自定义拦截器
        Map<String, Filter> myFilterMap = new HashMap<>();

        myFilterMap.put("e-perms",roleOrFilter);//可以配置RoleOrFilter的Bean
        //添加Shiro内置过滤器
        /**
         *  Shiro内置过滤器，可以实现权限相关的拦截器
         *  注意！！！ 有顺序要求
         *      常见的过滤器：
         *          anon: 无需认证（登录）就可以访问
         *          authc: 必须登录认证才可以访问
         *          user: 如果使用remember功能可以直接访问
         *          perms: 该资源必须获得资源权限才可以访问
         *          roles: 该资源必须获得角色权限才可以访问
         */

        Map<String,String> filterMap = new LinkedHashMap<String, String>();
        filterMap.put("/gas/myIndex","anon");
        filterMap.put("/gas/myLogin","anon");//为了实现登录（数据写入）的请求，应将myLogin也放行
        //filterMap.put("http://localhost:8080/facility","anon");//
        filterMap.put("/gas/toLogin","anon");//为了实现登录（数据写入）的请求，应将toLogin也放行
        //filterMap.put("/gas/logout","anon");//为了实现注销（数据写入）的请求，应将myLogin也放行
        filterMap.put("/gas/facility/add","e-perms[2|3]");//资源授权拦截，对应成功则可进入
        filterMap.put("/gas/**","authc");  //实现拦截功能

        //设置未授权提示页面
        bean.setUnauthorizedUrl("/gas/unshouquan");
        //设置登录错误提示页面
        bean.setLoginUrl("/gas/unauth");

        bean.setFilterChainDefinitionMap(filterMap);
        //使用自定义拦截器
        bean.setFilters(myFilterMap);
        return bean;
    }

    //DefaultWebSecurityManager
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联UserRealm
        securityManager.setRealm(userRealm);
        // 自定义session管理
        securityManager.setSessionManager(sessionManager());
        return securityManager;
    }
    @Bean
    public SessionManager sessionManager() {
        MySessionManager mySessionManager = new MySessionManager();
        return mySessionManager;
    }

    //创建Realm 对象 ，需要自定义类:1
    @Bean(name = "userRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }

    @Bean(name = "shiroDialect")
    //配置ShiroDialect，用于thymeleaf和shiro标签配合使用
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}
